﻿#ifndef DEVICEINSTANCEMANAGER_H
#define DEVICEINSTANCEMANAGER_H

#include <QString>
#include <QDebug>
#include <QMutex>
#include "libraryfactory.h" // 模板实现需要它
#include <memory>

class QObject;
class QMutex;

/**
 * @brief 一个用于按需创建和销毁设备库实例的静态生命周期管理器。
 *
 * 这个类是线程安全的，它允许从同一个动态库中创建多个独立的实例，
 * 并负责跟踪和安全地销毁它们，以防止内存泄漏。
 */
class DeviceInstanceManager
{
private:
    DeviceInstanceManager() = default;
    ~DeviceInstanceManager() = default;

public:
    DeviceInstanceManager(const DeviceInstanceManager &) = delete;
    DeviceInstanceManager &operator=(const DeviceInstanceManager &) = delete;

    /**
     * @brief [核心创建函数] 从指定的动态库创建一个全新的实例。
     * 每次调用都会返回一个独立的新对象。
     * @tparam T 期望返回的指针类型 (例如: IDevice*, IDeviceIO*)。
     * @param libraryPath 动态库的路径。
     * @return 如果成功，返回一个由本管理器跟踪的全新实例指针；否则返回 nullptr。
     */
    template<typename T>
    static T createInstance(const QString &libraryPath)
    {
        //使用底层的 LibraryFactory 创建一个原始实例。
        // LibraryFactory 每次都会调用库的 "instance" 函数，返回一个 new 出来的对象。
        T instance = LibraryFactory::resolve<T>(libraryPath);

        if (instance) {
            //如果创建成功，将其注册到的跟踪集合中。
            QMutexLocker locker(&s_mutex);
            s_managedInstances.insert(static_cast<QObject *>(instance));
//            qDebug() << "DeviceInstanceManager: Created and now tracking new instance"
//                     << static_cast<void *>(instance) << "from" << libraryPath;
        } else {
            qWarning() << "DeviceInstanceManager: Failed to create instance from" << libraryPath;
        }

        return instance;
    }

    /**
     * @brief [核心销毁函数] 销毁一个之前通过 createInstance 创建的特定实例。
     * @param instance 指向要销毁的实例的指针。
     * @return 如果成功找到并销毁，返回 true。
     */
    static bool destroyInstance(void *instance);

    /**
     * @brief [安全网] 销毁所有当前仍在跟踪的实例。
     * 主要用于程序退出时的自动清理，以防有实例被遗忘。
     */
    static void destroyAllInstances();

private:
    // 静态成员，用于存储所有存活的实例和实现线程安全
    static QSet<QObject *> s_managedInstances;
    static QMutex s_mutex;
};

// 通用 deleter：通过 DeviceInstanceManager 销毁实例（而不是直接 delete）
template<typename IFace>
struct ManagedDeviceDeleter {
    void operator()(IFace *p) const noexcept
    {
        if (p) {
            DeviceInstanceManager::destroyInstance(static_cast<void *>(p));
        }
    }
};

// 设备句柄 alias：由 unique_ptr 管理生命周期，deleter 统一走 DeviceInstanceManager
template<typename IFace>
using DeviceHandle = std::shared_ptr<IFace>;

template<typename IFace>
inline DeviceHandle<IFace> makeDeviceHandle(const QString &dllPath)
{
    IFace *raw = DeviceInstanceManager::createInstance<IFace *>(dllPath);
    return DeviceHandle<IFace>(raw, ManagedDeviceDeleter<IFace>());
}

#endif // DEVICEINSTANCEMANAGER_H
